#include <cstdio>
#include <cstring>

bool li[ 18 ][ 18 ];
int ll[ 1 << 18 ][ 18 ], cl[ 1 << 18 ];
int n, m;
long long f[ 1 << 18 ][ 18 ];

void pre( )
{
    int i, j;
    for ( i = 0; i < ( 1 << 18 ); i++ )
        for ( j = 0; j < 18; j++ )
            if ( i & ( 1 << j ) )
                ll[ i ][ cl[ i ]++ ] = j;
}

void init( )
{
    int i, u, v;
    memset( li, 0, sizeof( li ) );
    memset( f, 0, sizeof( f ) );
    for ( i = 0; i < m; i++ )
    {
        scanf("%d%d", &u, &v); u--; v--;
        li[ u ][ v ] = li[ v ][ u ] = 1;
    }
    f[ 1 ][ 0 ] = 1;
}

void work( )
{
    int i, j, k, p;
    long long ans = 0;
    if ( n == 1 )
    {
        puts("1");
        return ;
    }
    for ( i = 1; i < ( 1 << n ); i++ )
    {
        for ( j = 0; j < cl[ i ]; j++ )
        {
            p = i ^ ( 1 << ll[ i ][ j ] );
            for ( k = 0; k < cl[ p ]; k++ )
                if ( li[ ll[ p ][ k ] ][ ll[ i ][ j ] ] )
                    f[ i ][ ll[ i ][ j ] ] += f[ p ][ ll[ p ][ k ] ];
        }
    }
    for ( i = 0; i < n; i++ )
        if ( li[ i ][ 0 ] )
            ans += f[ ( 1 << n ) - 1 ][ i ];
    printf("%I64d\n", ans);
}

int main( )
{
    pre( );
    while ( scanf("%d%d", &n, &m) != EOF )
    {
        init( );
        work( );
    }
    return 0;
}
